package com.switz.agendacita.controller;

import com.switz.agendacita.dto.Empresa;
import com.switz.agendacita.dto.EmpresaPersonal;
import com.switz.agendacita.dto.EmpresaServicio;
import com.switz.agendacita.services.iface.EmpresaService;
import com.switz.agendacita.utils.Constantes;
import com.switz.agendacita.utils.EncryptAES;
import com.switz.agendacita.utils.GeneradorClaves;
import com.switz.agendacita.utils.mail.MailMail;
import com.switz.agendacita.vo.Login;
import com.switz.agendacita.vo.ReservacionSeleccionada;
import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class EmpresaController {

    @Autowired
    @Qualifier("empresaServiceImpl")
    private EmpresaService empresaService;
    @Autowired
    private MailMail mailMail;

    @RequestMapping(value = "/agregarEmpresa", method = RequestMethod.POST)
    public String agregarEmpresa(
            @RequestParam("nombre") String nombre,
            @RequestParam("direccion") String direccion,
            @RequestParam("telefono") String telefono,
            @RequestParam("movil") String movil,
            @RequestParam("mail") String mail,
            @RequestParam("psw") String psw,
            @RequestParam("imagen") MultipartFile file,
            @RequestParam("url") String url,
            @RequestParam("diasLaborales") String diasHorarios,
            @RequestParam("descripcion") String descripcion,
            @RequestParam("tags") String tags,
            @RequestParam("latitud") Double latitud,
            @RequestParam("longitud") Double longitud,
            @RequestParam("pais") String pais,
            @RequestParam("estado") String estado,
            @RequestParam("municipio") String municipio,
            @RequestParam("cp") String cp) throws IOException {


//        String image = "";
//        if (imagen != null) {
//            StringTokenizer tokenizer = new StringTokenizer(imagen, "\\");
//            while (tokenizer.hasMoreTokens()) {
//                image = tokenizer.nextToken();
//            }
//            imagen=image;
//        }
        Empresa empresa = new Empresa();



        GeneradorClaves cve = new GeneradorClaves();

        String cveTemp = cve.claveEmpresa();
        empresa.setId(cveTemp);
        empresa.setNombre(nombre);
        empresa.setDireccion(direccion);
        empresa.setMunicipio(municipio);
        empresa.setEstado(estado);
        empresa.setPais(pais);
        empresa.setCp(cp);
        empresa.setTelefono(telefono);
        empresa.setMovil(movil);
        empresa.setMail(mail);
        empresa.setUrl(url);
        empresa.setDiasHorarios(diasHorarios);

        if (file != null) {
            String extension = "";
            StringTokenizer tokenizer = new StringTokenizer(file.getOriginalFilename(), ".");
            while (tokenizer.hasMoreTokens()) {
                extension = tokenizer.nextToken();
            }

            File localFile = new File(Constantes.URL_IMAGEN + cveTemp + "." + extension);
            file.transferTo(localFile);
            empresa.setImagen(cveTemp + "." + extension);
        }
        empresa.setLatitud(latitud);
        empresa.setLongitud(longitud);
        empresa.setDescripcion(descripcion);
        empresa.setTags(tags);
        empresa.setPsw(psw);
        empresa.setStatus(0);
        empresa.setConfirmarCitas(1);




        empresaService.registrarEmpresa(empresa);
        return "index";

    }

    @RequestMapping(value = "/actualizarEmpresa")
    @ResponseBody
    public void actualizarEmpresa(
            @RequestParam("nombre") String nombre,
            @RequestParam("direccion") String direccion,
            @RequestParam("municipio") String municipio,
            @RequestParam("estado") String estado,
            @RequestParam("pais") String pais,
            @RequestParam("cp") String cp,
            @RequestParam("telefono") String telefono,
            @RequestParam("movil") String movil,
            @RequestParam("mail") String mail,
            @RequestParam("url") String url,
            @RequestParam("diasHorarios") String diasHorarios,
            @RequestParam("imagen") String imagen,
            @RequestParam("latitud") Double latitud,
            @RequestParam("longitud") Double longitud,
            @RequestParam("descripcion") String descripcion,
            @RequestParam("tags") String tags,
            @RequestParam("confirmarCitas") Integer confirmarCitas) {

        Empresa empresa = new Empresa();
        //obtener id por session
        empresa.setId("1227HNOA000");
        empresa.setNombre(nombre);
        empresa.setDireccion(direccion);
        empresa.setMunicipio(municipio);
        empresa.setEstado(estado);
        empresa.setPais(pais);
        empresa.setCp(cp);
        empresa.setTelefono(telefono);
        empresa.setMovil(movil);
        empresa.setMail(mail);
        empresa.setUrl(url);
        empresa.setDiasHorarios(diasHorarios);
        empresa.setImagen(imagen);
        empresa.setLatitud(latitud);
        empresa.setLongitud(longitud);
        empresa.setDescripcion(descripcion);
        empresa.setTags(tags);
        empresa.setConfirmarCitas(confirmarCitas);

        empresaService.actualizarEmpresa(empresa);

    }

    @RequestMapping(value = "/listarServiciosPorEmpresa")
    @ResponseBody
    public List listarServiciosPorEmpresa(@RequestParam("idEmpresa") String idEmpresa) {
        return empresaService.listarServiciosPorEmpresa(idEmpresa);
    }

    @RequestMapping(value = "/listarTiposPorEmpresa")
    @ResponseBody
    public List listarTiposPorEmpresa(@RequestParam("idEmpresa") String idEmpresa) {
        return empresaService.listarTiposPorEmpresa(idEmpresa);
    }

    @RequestMapping(value = "/listarTiposEmpresa")
    @ResponseBody
    public List listarTiposEmpresa() {
        return empresaService.listarTiposEmpresas();
    }

    @RequestMapping(value = "/listarCatalogoServiciosPorEmpresa")
    @ResponseBody
    public List listarCatalogoServiciosPorEmpresa(@RequestParam("idTipoEmpresa") String[] idTipoEmpresa) {
        return empresaService.listarCatalogoServiciosPorEmpresa(idTipoEmpresa);
    }

    @RequestMapping(value = "/reservacionesPendientesPorEmpresa")
    @ResponseBody
    public List listarReservacionesPendientesPorEmpresa(
            @RequestParam("idempresa") String idEmpresa) {


        return empresaService.listarReservacionesPendientesPorEmpresa(idEmpresa);


    }

    @RequestMapping(value = "/reservacionSeleccionada")
    @ResponseBody
    public ReservacionSeleccionada obtenerDatosReservacionSeleccionada() {
        return empresaService.obtenerDatosReservacionSeleccionada("12UYY1813Q075");

    }

    @RequestMapping(value = "/getLogin")
    @ResponseBody
    public Login getLogin() {
        return empresaService.getLogin("jose@switz.mx", "gavilan24");

    }

    @RequestMapping(value = "/agregarEmpresaPersonal")
    @ResponseBody
    public void agregarEmpresaPersonal(@RequestParam("idEmpresa") String idEmpresa, @RequestParam("idPersonal") String idPersonal) {
        EmpresaPersonal empresaPersonal = new EmpresaPersonal();
        empresaPersonal.setIdEmpresa(idEmpresa);
        empresaPersonal.setIdPersonal(idPersonal);
        empresaService.agregarEmpresaPersonal(empresaPersonal);

    }

    @RequestMapping(value = "/listarCatalogoSugerenciasServiciosPorEmpresa")
    @ResponseBody
    public List listarCatalogoSugerenciasServiciosPorEmpresa(@RequestParam("idEmpresa") String idEmpresa) {
        return empresaService.listarCatalogoSugerenciasServiciosPorEmpresa(idEmpresa);
    }

    @RequestMapping(value = "/obtenerEmpresaPorMail")
    @ResponseBody
    public Empresa obtenerEmpresaPorMail(
            @RequestParam("mail") String mail) {
        
        return empresaService.obtenerEmpresaPorMail(mail);

    }

    @RequestMapping(value = "/listarPersonalPorEmpresa")
    @ResponseBody
    public List listarPersonalPorEmpresa(@RequestParam("idEmpresa") String idEmpresa) {
        return empresaService.listarPersonalPorEmpresa(idEmpresa);
    }

    @RequestMapping(value = "/agregarEmpresaServicio")
    @ResponseBody
    public void agregarEmpresaServicio(
            @RequestParam("idEmpresa") String idEmpresa,
            @RequestParam("idServicio") String idServicio,
            @RequestParam("costo") float costo,
            @RequestParam("tiempo") int tiempo) {

        EmpresaServicio empresaServicio = new EmpresaServicio(idEmpresa, idServicio, costo, tiempo);
        empresaService.registrarEmpresaServicio(empresaServicio);
    }//agregarEmpresaServicio

    @RequestMapping(value = "/actualizarPswEmpresa")
    @ResponseBody
    public boolean actualizarPswEmpresa(
            @RequestParam("idempresa") String idEmpresa,
            @RequestParam("psw") String psw,
            @RequestParam("pswNuevo") String pswNuevo) {

        return empresaService.actualizarPsw(idEmpresa, psw, pswNuevo);
    }

    @RequestMapping(value = "/obtenerCostoTiempoDelServicio")
    @ResponseBody
    public EmpresaServicio obtenerCostoTiempoDelServicio() {
        return empresaService.obtenerCostoTiempoDelServicio("HBC6EYQS807", "11111111111");
    }

    @RequestMapping(value = "/actualizarCostoTiempoDelServicio")
    @ResponseBody
    public void actualizarCostoTiempoDelServicio() {
        empresaService.actualizarCostoTiempoDelServicio("HBC6EYQS807", "11111111111", (float) 40.0, 70);
    }

    @RequestMapping(value = "confirmarEmpresa")
    public String confirmarEmpresa(@RequestParam("idEmpresa") String idEmpresa, HttpSession session) {




        // System.out.println("id  como viene de la url " + idEmpresa);
        EncryptAES e = new EncryptAES();
        String idDesencriptado = null;
        try {
            idDesencriptado = e.decrypt(idEmpresa);
            //  System.out.println("id desicriptado " + idDesincriptado);
        } catch (Exception ex) {
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }

        Empresa empresa = empresaService.obtenerEmpresa(URLDecoder.decode(idDesencriptado));



        if (empresa != null) {
            empresaService.actualizarStatusEmpresa(idDesencriptado);
            empresa.setStatus(1);
            session.setAttribute("empresa", empresa);

            return "empresaAdmin";
        } else {
            return "failed";
        }



    }
@RequestMapping(value = "/enviarCorreoEmpresa",method = RequestMethod.POST)
    @ResponseBody
    public String enviarCorreoEmpresa(@RequestParam("mail") String mail, @RequestParam("id") String id) {
   
    String cadena="success";
        try {
            EncryptAES aES = new EncryptAES();
            String idEncriptado = aES.encrypt(id);
            //System.out.println("id empresa encriptado "+idEncriptado);
            String idEncodificadoEIncriptado = URLEncoder.encode(idEncriptado);
            //System.out.println("id empresa encodificado "+idEncodificadoEIncriptado);
            //enviamos correo de confirmar usuario 
            mailMail.sendMail(mail, "confirmar empresa",
                    new String().format(Constantes.CONFIRMAR_EMPRESA, idEncodificadoEIncriptado));

        } catch (Exception ex) {
            cadena="failed";
        }


        return cadena;
    }


}
